#include "cxiverticalheaderview.h"
#include "cxiadvancedview.h"

#include <QPainter>
#include <QPaintEvent>

CxiVerticalHeaderView::CxiVerticalHeaderView(QWidget* parent)
    : QHeaderView(Qt::Vertical, parent), m_view(nullptr)
{
    setSectionsClickable(false);
    setSectionsMovable(false);
    setDefaultSectionSize(24);
    setMinimumWidth(40);
    // 如果你想允许用户拖动宽度，请取消下面这一行
    setFixedWidth(40);
}

void CxiVerticalHeaderView::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.save();

    // 背景
    painter.fillRect(event->rect(), QColor(245, 245, 245));

    if (!m_view) {
        // 没注入 view，则交给基类绘制
        QHeaderView::paintEvent(event);
        painter.restore();
        return;
    }

    QAbstractItemModel *model = m_view->model();
    if (!model) {
        QHeaderView::paintEvent(event);
        painter.restore();
        return;
    }

    // 如果处于分组/树模式，暂时退化到基类绘制
    if (m_view->isGroupingEnabled()) {
        QHeaderView::paintEvent(event);
        painter.restore();
        return;
    }

    // 考虑 root index
    QModelIndex root = m_view->rootIndex();
    const int totalRows = model->rowCount(root);

    // 对每一个逻辑行，使用 visualRect() 获取在 viewport 中的位置，然后把该位置映射到 header 的坐标系
    for (int logicalRow = 0; logicalRow < totalRows; ++logicalRow) {
        QModelIndex idx = model->index(logicalRow, 0, root);
        if (!idx.isValid()) continue;

        QRect vr = m_view->visualRect(idx); // 相对于 viewport 的矩形
        if (vr.isEmpty()) continue;

        // 将 viewport 的坐标转换到 header(this) 的坐标系
        QPoint mappedTopLeft = m_view->viewport()->mapTo(this, vr.topLeft());
        QRect sectionRect(0, mappedTopLeft.y(), width(), vr.height());

        if (!event->region().intersects(sectionRect))
            continue;

        // 背景 & 边框
        painter.fillRect(sectionRect, QColor(245, 245, 245));
        painter.setPen(Qt::gray);
        painter.drawRect(sectionRect.adjusted(0, 0, -1, -1));

        // 行号（从 1 开始）
        QString text = QString::number(logicalRow + 1);
        painter.setPen(Qt::black);
        painter.drawText(sectionRect, Qt::AlignCenter, text);
    }

    painter.restore();
}